package com.leetcode.concurrency.singleton;

import java.util.HashMap;
import java.util.Map;

// 单例表模式
public class RegSingleton {
    static private Map<String, Object> registry = new HashMap<>();

    //静态块，在类被加载时自动执行
    static {
        RegSingleton rs = new RegSingleton();
        registry.put(rs.getClass().getName(), rs);
    }

    //受保护的默认构造函数，如果为继承关系，则可以调用，克服了单例类不能为继承的缺点
    protected RegSingleton() {
    }

    public static int _i = 0;

    static {
        _i = 10;
    }

    //静态工厂方法，返回此类的唯一实例
    public static RegSingleton getInstance(String name) {
        if (name == null) {
            name = "RegSingleton";
        }
        if (registry.get(name) == null) {
            try {
                // 扫描所有Component注解的全限定名，并加入单例表
                registry.put(name, Class.forName(name).newInstance());
            } catch (IllegalAccessException | InstantiationException | ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
        return (RegSingleton) registry.get(name);
    }
}
